package abel.wlmr.model;

/**
 * 协议标识由图 2 中 D0～D1 两位编码表示，定义如下：
 * ——D0=0、 D1=0：为禁用；
 * ——D0=1、 D1=0：为本协议使用；
 * ——D0=0、 D1=1： 已用；
 * ——D0=1、 D1=1， 保留。
 * 用户数据长度 L1：由 D2～D15 组成，采用 BIN 编码，是控制域、地址域、链路用户数据（应用层）
 * 的字节总数。
 * ——采用专用无线数传信道，长度 L1 不大于 255；
 * ——采用网络传输，长度 L1 不大于 16383。
 * 
 * @author Abel
 *
 */
public class WlmrLengthField extends WlmrField {

    private int status = 1;

    private short length;

    public WlmrLengthField() {
        super(2);
    }

    @Override
    public int getValue() {
        if (status < 0 || status > 3 || length < 0 || length > 16383) {
            throw new IllegalArgumentException("status should be [0, 3] and length should be [0, 16383]");
        }

        return status | (length << 2);
    }

    @Override
    public void parseValue(int v) throws WlmrException {
        status = v & 0x03;
        length = (short) ((0xFFFF & v) >> 2);

    }

    /**
     * @return the status
     */
    public int getStatus() {
        return status;
    }

    /**
     * @param status
     *            the status to set
     */
    public void setStatus(int status) {
        if (status < 0 || status > 3) {
            throw new IllegalArgumentException("status should be [0, 3]");
        }

        this.status = status;
    }

    /**
     * @return the length
     */
    public short getLength() {
        return length;
    }

    /**
     * @param length
     *            the length to set
     */
    public void setLength(short length) {
        if (length < 0 || length > 16383) {
            throw new IllegalArgumentException("length should be [0, 16383]");
        }

        this.length = length;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof WlmrLengthField) || obj == null) {
            return false;
        }

        WlmrLengthField l2 = (WlmrLengthField) obj;
        return l2.getLength() == length && l2.status == status;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return String.format("{status:%x, length:0x%02X}", status, length);
    }

}
